/*
首先简单说一下什么是队列 
队列呢  跟你排队一个道理 谁先排到谁先走 
这里就能体现出 队列的特点 也就是  FIFO first in first out 

相比链表 队列更加简单 如果使用数组实现的话就不需要任何基础节点作为支持 
单独说一个叫循环队列的事情 
每次入队和出队之后，把头尾的指针重新恢复到初始位置，
如果进入或者出去一个 就 + 1 或者 -1 然后如果是 最大长度-1 在入队之后取模 = 0 
指针就会回到起始位置 
*/

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

// 设置一个队列的最大长度 你想设置成多少都是可以的
const int MAX_SIZE =  5;

/*
    队列的基础属性就是头尾 和一个够层队列的数组，数组长度是最大长度 
    以及 记录队列的长度  
*/
typedef struct Queue{}Queue;


/*
    初始化就是直接分配内存，判断内存是否分配成功
    然后所有数值置于 0 
*/
Queue* init_queue();


/*
    判断空不空 直接返回看长度是否为 0 
*/
bool isEmpty(Queue* q);

/*
    判断是否是 满的 直接看长度是否能够等于最大长度 
*/
bool isFull(Queue* q);

/*
    获取到长度 
    直接返回长度 
*/
int getSize(Queue* q);


/*
    入队
    首先判断是否是满的 如果满的话提示退出 
    把data 加入到队尾 然后更新rear的位置
    保证入队之后rear仍然在队尾的位置  
    长度+1 
*/
void enQueue(Queue* q,int data);

/*
    出队  
    首先判断是否为空 空提示退出 
    然后定义一个变量用来保存队首元素 
    然后调整队首指针front 更新成 front+1对最大长度取余 
    这个是保证出队之后指针仍然到队首位置
    队伍长度-1 
    返回队首元素 
*/
int deQueue(Queue* q,int data);

/*
    判断是否空  如果为空就退出 
    不空 就直接 返回front 在数组中对应的元素 也就是队首元素 
*/
int front(Queue* q);


